package sunyu.tools.common;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Period;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class TimeTools {

    private static final Logger logger = LoggerFactory.getLogger(Thread.currentThread().getClass());

    private static final String PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 添加或减少n秒
     *
     * @param date
     * @param n
     *
     * @return
     */
    public Date addSecond(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusSeconds(n);
        return dt.toDate();
    }

    /**
     * 添加或减少n分钟
     *
     * @param date
     * @param n
     *
     * @return
     */
    public Date addMinute(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusMinutes(n);
        return dt.toDate();
    }

    /**
     * 添加或减少n小时
     *
     * @param date
     * @param n
     *
     * @return
     */
    public Date addHour(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusHours(n);
        return dt.toDate();
    }

    /**
     * 添加或减少N天
     *
     * @param date
     * @param n    为负数时是减少
     *
     * @return
     */
    public Date addDay(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusDays(n);
        return dt.toDate();
    }

    /**
     * 添加或减少N周
     *
     * @param date
     * @param n    为负数时是减少
     *
     * @return
     */
    public Date addWeek(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusWeeks(n);
        return dt.toDate();
    }

    /**
     * 添加或减少N月
     *
     * @param date
     * @param n    为负数时是减少
     *
     * @return
     */
    public Date addMonth(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusMonths(n);
        return dt.toDate();
    }

    /**
     * 添加或减少n年
     *
     * @param date
     * @param n
     *
     * @return
     */
    public Date addYear(Date date, int n) {
        DateTime dt = new DateTime(date);
        dt = dt.plusYears(n);
        return dt.toDate();
    }

    /**
     * 时间转字符串
     *
     * @param date
     * @param pattern 格式(例：yyyy-MM-dd HH:mm:ss)
     *
     * @return
     */
    public String toString(Date date, String pattern) {
        DateTime dt = new DateTime(date);
        return dt.toString(pattern);
    }

    /**
     * 时间转字符串
     *
     * @param date
     *
     * @return yyyy-MM-dd HH:mm:ss
     */
    public String toString(Date date) {
        return toString(date, PATTERN);
    }

    /**
     * 获取时间差
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 时间差(period.getDays(), period.getHours(), period.getMinutes(), period.getSeconds())
     */
    public Period getInterval(Date start, Date end) {
        Interval interval = new Interval(start.getTime(), end.getTime());
        Period period = interval.toPeriod();
        return period;
    }

    /**
     * 获取时间差
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 时间差(%s年%s月%s天%s小时%s分钟%s秒%s毫秒)
     */
    public String getIntervalString(Date start, Date end) {
        Period p = getInterval(start, end);
        return String.format("%s年%s月%s天%s小时%s分钟%s秒%s毫秒", p.getYears(), p.getMonths(), p.getDays(), p.getHours(), p.getMinutes(), p.getSeconds(), p.getMillis());
    }

}
